Data Overview
data <- read_csv(here::here("data/jackson.csv"),
col_types = cols(
.default = col_double(),
album_uri = col_character(),
album_name = col_character(),
album_img = col_character(),
album_release_date = col_character(),
album_release_year = col_date(format = ""),
album_popularity = col_integer(),
track_name = col_character(),
track_uri = col_character(),
key = col_character(),
mode = col_character(),
time_signature = col_integer(),
key_mode = col_character(),
track_popularity = col_integer()
)) %>%
mutate(album_name = gsub(".*(1954).*",
"The Music of Brazil/Jackson do Pandeiro",
album_name));
data %>%
glimpse()
Observations: 500
Variables: 23
$ album_uri <chr> "5T9tTjPIfjbUJGRJdYOOLl", "5T9tTjPIfjbUJGRJdYOOLl", "5T9tTjPIfjb...
$ album_name <chr> "Jackson Do Pandeiro Volume 1: Tum, Tum, Tum!", "Jackson Do Pand...
$ album_img <chr> "https://i.scdn.co/image/5dcc4a0cad740f1ee0774196d0a14f3693ef887...
$ album_release_date <chr> "1958-11-11", "1958-11-11", "1958-11-11", "1958-11-11", "1958-11...
$ album_release_year <date> 1958-11-11, 1958-11-11, 1958-11-11, 1958-11-11, 1958-11-11, 195...
$ album_popularity <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ track_name <chr> "Tum, Tum, Tum", "Pacífico Pacato", "Nortista Quatrocentão", "Se...
$ track_uri <chr> "6cCYhV6fU68uzbjWPG9V7x", "6Gu7y9SgtVTGh8YGhDPtCe", "1hq7M7cJtvD...
$ danceability <dbl> 0.501, 0.663, 0.550, 0.447, 0.544, 0.571, 0.495, 0.572, 0.500, 0...
$ energy <dbl> 0.987, 0.962, 0.947, 0.969, 0.972, 0.926, 0.967, 0.986, 0.947, 0...
$ key <chr> "A", "F", "D", "G", "E", "F", "E", "C", "F", "A#", "E", "F", "D#...
$ loudness <dbl> 2.561, 1.137, 1.621, 2.743, 2.513, 2.414, 2.375, 2.597, 3.078, 3...
$ mode <chr> "major", "major", "major", "major", "minor", "major", "minor", "...
$ speechiness <dbl> 0.0429, 0.1810, 0.0469, 0.0549, 0.0502, 0.0344, 0.0576, 0.0367, ...
$ acousticness <dbl> 0.718, 0.738, 0.666, 0.759, 0.787, 0.651, 0.712, 0.194, 0.286, 0...
$ instrumentalness <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ liveness <dbl> 0.282, 0.200, 0.251, 0.333, 0.176, 0.342, 0.321, 0.301, 0.323, 0...
$ valence <dbl> 0.963, 0.961, 0.923, 0.899, 0.783, 0.961, 0.755, 0.989, 0.957, 0...
$ tempo <dbl> 101.676, 113.562, 116.125, 116.023, 112.863, 133.065, 117.822, 1...
$ duration_ms <dbl> 158133, 139773, 163173, 143733, 151653, 157480, 158133, 154680, ...
$ time_signature <int> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4...
$ key_mode <chr> "A major", "F major", "D major", "G major", "E minor", "F major"...
$ track_popularity <int> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0...
Dançabilidade (danceability)
data %>%
ggplot(aes(sample=danceability)) +
stat_qq()

hchart (data$danceability,
color = "#B71C1C",
name = "Dançabilidade")
- Nenhum valor fora do domínio dos valores, a dançabilidade parece girar em torno de 0.6 e 0.7.
Verbosidade (speechines)
data %>%
ggplot(aes(sample=speechiness)) +
stat_qq()

hchart (data$speechiness,
color = "#B71C1C",
name = "Verbosidade")
- Nenhum valor fora do domínio dos valores. A verbosidade é em geral baixa, observando a música de Jackson o ritmo parece ser a questão principal, com letras curtas e quase repetitivas.
Duração (duration)
data <- data %>%
mutate(duration_s = duration_ms/1000)
data %>%
select(duration_s) %>%
glimpse()
Observations: 500
Variables: 1
$ duration_s <dbl> 158.133, 139.773, 163.173, 143.733, 151.653, 157.480, 158.133, 154.680, ...
data %>%
ggplot(aes(sample=duration_s)) +
stat_qq()

hchart (data$duration_s,
color = "#B71C1C",
name = "Duração (s)")
- Nenhum valor fora do domínio dos valores. As músicas giram em torno de 160 segundos (2 minutos e 40 segundos), as músicas de Jackson são em geral curtas.
Remasterização (remaster)
data <- data %>%
mutate(remaster = album_release_date > "1981-30-12")
data %>%
select(album_name, album_release_year, remaster) %>%
sample_n(10)
temp <- data %>%
distinct(album_name,
.keep_all = TRUE) %>%
mutate(remaster = ifelse(remaster == TRUE,"remasterizado","original"))
hchart(temp$remaster,
colorByPoint = TRUE,
name="Álbum")
- Álbuns remasterizados/relançados são muito mais frequentes.
temp <-
data %>%
distinct(album_name, .keep_all = TRUE) %>%
group_by(album_release_year) %>%
summarise(original_n = sum(!remaster),
remaster_n = sum(remaster))
highchart() %>%
hc_xAxis(categories = temp$album_release_year) %>%
hc_add_series(temp$original_n,
type = "column",
color = "#B71C1C",
name = "Não remasterizado") %>%
hc_add_series(temp$remaster_n,
type = "column",
name = "Remasterizado") %>%
hc_title(text = "Número de álbuns por ano")
- O ano de 2016 representa um aumento altíssimo na disponibilização de álbuns de Jackson no Spotify.
LS0tCnRpdGxlOiAiSmFja3NvbiAtIE8gcmVpIGRvIFJpdG1vIgpzdWJ0aXRsZTogJ0Fuw6FsaXNlIHNvYnJlIEphY2tzb24gZG8gUGFuZGVpcm8gKFNwb3RpZnkpJwphdXRob3I6ICJKb3PDqSBCZW5hcmRpIGRlIFNvdXphIE51bmVzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCiMjIENvbmp1bnRvIGRlIGRhZG9zIHV0aWxpemFkbwoKQW7DoWxpc2UgZXhwbG9yYXTDs3JpYSBkZSBkYWRvcyBkbyBbU3BvdGlmeV0oaHR0cHM6Ly93d3cuc3BvdGlmeS5jb20vYnIvKSAgc29icmUgb3Mgw6FsYnVucyBlIG3DunNpY2FzIGRlIEphY2tzb24gZG8gUGFuZGVpcm8gU3RyZWFtaW5nLiBPcyBkYWRvcyBvcmlnaW5haXMgZSBhcyB2YXJpw6F2ZWlzIHbDqm0gW2Rlc3RlIHJlcG9zaXRvcmlvXShodHRwczovL2dpdGh1Yi5jb20vY2llbmNpYWRlZGFkb3MtdWZjZy92aXMtY2FuY29lcykgLiBBIGV4cGxpY2HDp8OjbyBkZSBjb21vIG9zIGRhZG9zIGZvcmFtIGdlcmFkb3MgZXN0w6EgZGlzcG9uw612ZWwgW25hIGRvY3VtZW50YcOnw6NvIGRhIEFQSSBkbyBTcG90aWZ5XShodHRwczovL2JldGEuZGV2ZWxvcGVyLnNwb3RpZnkuY29tL2RvY3VtZW50YXRpb24vd2ViLWFwaS9yZWZlcmVuY2Uvb2JqZWN0LW1vZGVsLyNhdWRpby1mZWF0dXJlcy1vYmplY3QpLgoKIyMjIENvbnNpZGVyYcOnw7VlcwoKTmEgYW7DoWxpc2UgYWJhaXhvIGZvaSBwb3Nzw612ZWwgcGVyY2ViZXI6CgoqIENvbW8gYSBmYWxhIG7Do28gw6kgYSBncmFuZGUgcXVlc3TDo28gbmEgZGFuw6dhYmlsaWRhZGUgZGFzIG3DunNpY2FzIGRlIEphY2tzb24sIG8gcXVlIGVyYSBkZSBzZSBlc3BlcmFyIGRvICoqUmVpIGRvIFJpdG1vKiouIAoqIFZpbW9zIGNvbW8gbm8gU3BvdGlmeSBhIG1haW9yIHBhcnRlIGRvcyDDoWxidW5zIHPDo28gcmVtYXN0ZXJpemFkb3MvcmVsYW7Dp2Fkb3MgZSBlc3RlcyAgc8OjbyBvcyBtYWlzIHBvcHVsYXJlcy4gCiogRm9pIHBvc3PDrXZlbCB2aXNsdW1icmFyIGEgaW5jcsOtdmVsIGRpdmVyc2lkYWRlIGRvIGNhbnRvciBxdWUgbm9zIGZvaSByZWFmaXJtYWRhIGVtIHRlcm1vcyBkZSBub3RhcyBtdXNpY2FpcyBlIGRlIGR1cmHDp8Ojby4KKiBQb3IgZmltLCBmb2kgcG9zc8OtdmVsIHBlcmNlYmVyIGNvbW8gbyB0b20gZSBtZXNtbyBhIGR1cmHDp8OjbyBkYXMgZmFpeGFzIGRlIEphY2tzb24gbsOjbyByZXByZXNlbnRhbSBzb21lbnRlIGEgaW5jcsOtdmVsIGRpdmVyc2lkYWRlIGRlIHN1YSBtw7pzaWNhLCBtYXMgdGFtYsOpbSByZWZsZXRlbSBzdWEgdmlkYSBwZXNzb2FsLiBVbSBldmVudG8gZGUgbmF0dXJlemEgcGVzc29hbCBhZmV0YSB2aXNpdmVsbWVudGUgbyB0b20gZGUgc3VhIG3DunNpY2EuCgpgYGB7ciBzZXR1cCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZHBseXIsIHdhcm4uY29uZmxpY3RzID0gRkFMU0UpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQpsaWJyYXJ5KHN0cmluZ3IpCnRoZW1lX3NldCh0aGVtZV9idygpKQpgYGAKCiMjIERhdGEgT3ZlcnZpZXcKCmBgYHtyfQpkYXRhIDwtIHJlYWRfY3N2KGhlcmU6OmhlcmUoImRhdGEvamFja3Nvbi5jc3YiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gY29sX2RvdWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX3VyaSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV9uYW1lID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX2ltZyA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV9yZWxlYXNlX2RhdGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1fcmVsZWFzZV95ZWFyID0gY29sX2RhdGUoZm9ybWF0ID0gIiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX3BvcHVsYXJpdHkgPSBjb2xfaW50ZWdlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX25hbWUgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdXJpID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfc2lnbmF0dXJlID0gY29sX2ludGVnZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfbW9kZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19wb3B1bGFyaXR5ID0gY29sX2ludGVnZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpICU+JQogICAgICAgICBtdXRhdGUoYWxidW1fbmFtZSA9IGdzdWIoIi4qKDE5NTQpLioiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgTXVzaWMgb2YgQnJhemlsL0phY2tzb24gZG8gUGFuZGVpcm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1fbmFtZSkpOwpkYXRhICU+JSAKICAgIGdsaW1wc2UoKQpgYGAKCiMjIyBEYW7Dp2FiaWxpZGFkZSAoZGFuY2VhYmlsaXR5KQoKYGBge3J9CmRhdGEgJT4lIAogICAgZ2dwbG90KGFlcyhzYW1wbGU9ZGFuY2VhYmlsaXR5KSkgKyAKICAgICAgICBzdGF0X3FxKCkKYGBgCgpgYGB7cn0KaGNoYXJ0IChkYXRhJGRhbmNlYWJpbGl0eSwKICAgICAgICBjb2xvciA9ICIjQjcxQzFDIiwKICAgICAgICBuYW1lID0gIkRhbsOnYWJpbGlkYWRlIikKYGBgCgoqIE5lbmh1bSB2YWxvciBmb3JhIGRvIGRvbcOtbmlvIGRvcyB2YWxvcmVzLCBhIGRhbsOnYWJpbGlkYWRlIHBhcmVjZSBnaXJhciBlbSB0b3JubyBkZSAwLjYgZSAwLjcuCgojIyMgVmVyYm9zaWRhZGUgKHNwZWVjaGluZXMpCgpgYGB7cn0KZGF0YSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHNhbXBsZT1zcGVlY2hpbmVzcykpICsgCiAgICAgICAgc3RhdF9xcSgpCmBgYAoKYGBge3J9CmhjaGFydCAoZGF0YSRzcGVlY2hpbmVzcywKICAgICAgICBjb2xvciA9ICIjQjcxQzFDIiwKICAgICAgICBuYW1lID0gIlZlcmJvc2lkYWRlIikKYGBgCgoqIE5lbmh1bSB2YWxvciBmb3JhIGRvIGRvbcOtbmlvIGRvcyB2YWxvcmVzLiBBIHZlcmJvc2lkYWRlIMOpIGVtIGdlcmFsIGJhaXhhLCBvYnNlcnZhbmRvIGEgbcO6c2ljYSBkZSBKYWNrc29uIG8gcml0bW8gcGFyZWNlIHNlciBhIHF1ZXN0w6NvIHByaW5jaXBhbCwgY29tIGxldHJhcyBjdXJ0YXMgZSBxdWFzZSByZXBldGl0aXZhcy4KCiMjIyBEdXJhw6fDo28gKGR1cmF0aW9uKQoKYGBge3J9CmRhdGEgPC0gZGF0YSAlPiUKICAgIG11dGF0ZShkdXJhdGlvbl9zID0gZHVyYXRpb25fbXMvMTAwMCkKCmRhdGEgJT4lIAogICAgc2VsZWN0KGR1cmF0aW9uX3MpICU+JQogICAgZ2xpbXBzZSgpCmBgYAoKCmBgYHtyfQpkYXRhICU+JSAKICAgIGdncGxvdChhZXMoc2FtcGxlPWR1cmF0aW9uX3MpKSArIAogICAgICAgIHN0YXRfcXEoKQpgYGAKCmBgYHtyfQpoY2hhcnQgKGRhdGEkZHVyYXRpb25fcywKICAgICAgICBjb2xvciA9ICIjQjcxQzFDIiwKICAgICAgICBuYW1lID0gIkR1cmHDp8OjbyAocykiKQpgYGAKCiogTmVuaHVtIHZhbG9yIGZvcmEgZG8gZG9tw61uaW8gZG9zIHZhbG9yZXMuIEFzIG3DunNpY2FzIGdpcmFtIGVtIHRvcm5vIGRlIDE2MCBzZWd1bmRvcyAoMiBtaW51dG9zIGUgNDAgc2VndW5kb3MpLCBhcyBtw7pzaWNhcyBkZSBKYWNrc29uIHPDo28gZW0gZ2VyYWwgY3VydGFzLgoKIyMjIFJlbWFzdGVyaXphw6fDo28gKHJlbWFzdGVyKQoKCmBgYHtyfQpkYXRhIDwtIGRhdGEgJT4lCiAgICBtdXRhdGUocmVtYXN0ZXIgPSBhbGJ1bV9yZWxlYXNlX2RhdGUgPiAiMTk4MS0zMC0xMiIpCgpkYXRhICU+JSAKICAgIHNlbGVjdChhbGJ1bV9uYW1lLCBhbGJ1bV9yZWxlYXNlX3llYXIsIHJlbWFzdGVyKSAlPiUKICAgIHNhbXBsZV9uKDEwKQpgYGAKCgpgYGB7cn0KdGVtcCA8LSBkYXRhICU+JSAKICAgIGRpc3RpbmN0KGFsYnVtX25hbWUsCiAgICAgICAgICAgICAua2VlcF9hbGwgPSBUUlVFKSAlPiUKICAgIG11dGF0ZShyZW1hc3RlciA9IGlmZWxzZShyZW1hc3RlciA9PSBUUlVFLCJyZW1hc3Rlcml6YWRvIiwib3JpZ2luYWwiKSkKCmhjaGFydCh0ZW1wJHJlbWFzdGVyLAogICAgICAgY29sb3JCeVBvaW50ID0gVFJVRSwKICAgICAgIG5hbWU9IsOBbGJ1bSIpCmBgYAoKKiDDgWxidW5zIHJlbWFzdGVyaXphZG9zL3JlbGFuw6dhZG9zIHPDo28gbXVpdG8gbWFpcyBmcmVxdWVudGVzLgoKYGBge3J9CnRlbXAgPC0KICAgIGRhdGEgJT4lIAogICAgZGlzdGluY3QoYWxidW1fbmFtZSwgLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgICBncm91cF9ieShhbGJ1bV9yZWxlYXNlX3llYXIpICU+JQogICAgc3VtbWFyaXNlKG9yaWdpbmFsX24gPSBzdW0oIXJlbWFzdGVyKSwKICAgICAgICAgICAgICByZW1hc3Rlcl9uID0gc3VtKHJlbWFzdGVyKSkKCmhpZ2hjaGFydCgpICU+JQoKICBoY194QXhpcyhjYXRlZ29yaWVzID0gdGVtcCRhbGJ1bV9yZWxlYXNlX3llYXIpICU+JQogIGhjX2FkZF9zZXJpZXModGVtcCRvcmlnaW5hbF9uLCAKICAgICAgICAgICAgICAgIHR5cGUgPSAiY29sdW1uIiwKICAgICAgICAgICAgICAgIGNvbG9yID0gIiNCNzFDMUMiLAogICAgICAgICAgICAgICAgbmFtZSA9ICJOw6NvIHJlbWFzdGVyaXphZG8iKSAlPiUKICBoY19hZGRfc2VyaWVzKHRlbXAkcmVtYXN0ZXJfbiwgCiAgICAgICAgICAgICAgICB0eXBlID0gImNvbHVtbiIsCiAgICAgICAgICAgICAgICBuYW1lID0gIlJlbWFzdGVyaXphZG8iKSAgJT4lCiAgICAgIGhjX3RpdGxlKHRleHQgPSAiTsO6bWVybyBkZSDDoWxidW5zIHBvciBhbm8iKQoKYGBgCgoqIE8gYW5vIGRlIDIwMTYgcmVwcmVzZW50YSB1bSBhdW1lbnRvIGFsdMOtc3NpbW8gbmEgZGlzcG9uaWJpbGl6YcOnw6NvIGRlIMOhbGJ1bnMgZGUgSmFja3NvbiBubyBTcG90aWZ5LiAKCiMjIE1haXMgZGlzY3Vyc28vZGnDoWxvZ28gKHNwZWVjaGluZXMpIHRlbSBlZmVpdG8gc29icmUgYSBkYW7Dp2FiaWxpZGFkZSBkYSBtw7pzaWNhPwoKYGBge3J9CnAgPC0gZGF0YSAlPiUgCiAgICAgICAgZGlzdGluY3QodHJhY2tfbmFtZSwgLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgICAgICAgZ2dwbG90KGFlcyh4PXNwZWVjaGluZXNzLAogICAgICAgICAgICAgICAgICAgeT1kYW5jZWFiaWxpdHkpKSArCiAgICAgICAgZ2VvbV9wb2ludChhbHBoYT0wLjQpIAoKZ2dwbG90bHkocCkKYGBgCgo8YnI+PC9icj4KCk7Do28gcGFyZWNlIGhhdmVyIHVtYSByZWxhw6fDo28gY2xhcmEgZW50cmUgYSBkYW7Dp2FiaWxpZGFkZSBkYXMgbcO6c2ljYXMgZGUgSmFja3NvbiBlIGEgdmVyYm9zaWRhZGUgZGUgc3VhcyBtw7pzaWNhcy4gVGVtb3MgbXVpdGFzIGZhaXhhcyBkZSBkaWZlcmVudGUgZ3JhdSBkZSBkYW7Dp2FiaWxpZGFkZSBkZSBtZXNtbyBncmF1IGJhaXhvIGRlIHZlcmJvc2lkYWRlLiAgClF1YW5kbyBhdW1lbnRhbW9zIGEgdmVyYm9zaWRhZGUgZGFzIG3DunNpY2FzIChtYWlzIMOgIGRpcmVpdGEgbm8gZWl4bykgYSBkYW7Dp2FiaWxpZGFkZSBzZSBtYW50w6ltIHJlbGF0aXZhbWVudGUgZXN0w6F2ZWwgKE8gYXVtZW50byBuYSBkYW7Dp2FiaWxpZGFkZSDDqSBtYXJnaW5hbCkuICAKCgpgYGB7cn0KZGF0YSAlPiUgCiAgICBkaXN0aW5jdCh0cmFja19uYW1lLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUKICAgIGdncGxvdChhZXMoc3BlZWNoaW5lc3MsZGFuY2VhYmlsaXR5KSkgKwogICAgc3RhdF9kZW5zaXR5MmQoYWVzKGZpbGwgPSAuLmxldmVsLi4pLCBnZW9tID0gInBvbHlnb24iKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMSwwLjAxKSkKCmBgYAoKPGJyPjwvYnI+CgrDiSBwb3Nzw612ZWwgdmVyIG1haXMgY2xhcmFtZW50ZSBxdWUgbyBwb250byBkZSBtYWlvciBvY29ycsOqbmNpYSAoY3VtZSBvdSBwb250byBkZSBsZXZlbCBtYWlzIGFsdG8pIMOpIGVtIGVtIHRvcm5vIGRlIDAuNyBkZSBkYW7Dp2FiaWxpZGFkZSBlIGRlIGFwcm94aW1hZGFtZW50ZSAwLjA0ICh2YWxvcmVzIG11aXRvIGJhaXhvIGRlIHZlcmJvc2lkYWRlKS4gICAKSXNzbyBpbXBsaWNhIGVtIGFsZ28gasOhIGVzcGVyYWRvLCBKYWNrc29uIG7Do28gcHJlY2lzYSBmYWxhciBtdWl0byBwcmEgdG9ybmFyIHN1YXMgbcO6c2ljYXMgZGFuw6dhbnRlcywgbsOjbyDDqSBhIHRvYSBxdWUgSmFja3NvbiBnYW5ob3UgYSBhbGN1bmhhIGRlIFJlaSBkbyBSaXRtby4gCgoqIE8gYXVtZW50byBlbSB2ZXJib3NpZGFkZSBuw6NvIHBhcmVjZSBhZmV0YXIgc2lnbmlmaWNhdGl2YW1lbnRlIGEgZGFuw6dhYmlsaWRhZGUuCiogVmVyYm9zaWRhZGUgbsOjbyBzZXJpYSBhIHJlYWwgcmF6w6NvIGRhIHNpZ25pZmljYXRpdmEgZGFuw6dhYmlsaWRhZGUgZGFzIG3DunNpY2FzIGRlIEphY2tzb24sIG8gcXVhbCDDqSBub3TDs3JpbyBwZWxhIGJhdGlkYSBlIHJpdG1vIGRlIHN1YXMgbcO6c2ljYXMgKHRlbmRvIHNpZG8gbm9tZWFkbyBhdMOpIG1haW9yIHJpdG1pc3RhIGRhIGhpc3TDs3JpYSBkYSBtw7pzaWNhIHBvcHVsYXIgYnJhc2lsZWlyYSkuICAgICAKCiMjIENvbW8gbyBwYXNzYXIgZG9zIGFub3MgYWZldGEgbyB0ZW1wbyBkZSBkdXJhw6fDo28gZGEgbcO6c2ljYT8KCmBgYHtyfQptIDwtIGxpc3QoCiAgbCA9NzAsCiAgYiA9IDE1MCkKCnAgPC0gZGF0YSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9YXMuZmFjdG9yKGFsYnVtX3JlbGVhc2VfeWVhciksCiAgICAgICAgICAgICAgIGR1cmF0aW9uX3MsCiAgICAgICAgICAgICAgIGdyb3VwPWFsYnVtX3JlbGVhc2VfeWVhciwKICAgICAgICAgICAgICAgY29sb3I9cmVtYXN0ZXIpKSArCiAgICBnZW9tX2JveHBsb3QocG9zaXRpb24gPSAiZG9kZ2UiLCBhbHBoYT0wLjYpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpCgpnZ3Bsb3RseShwKSAlPiUKICAgICBsYXlvdXQoYXV0b3NpemUgPSBGLCBtYXJnaW49bSkKYGBgCgpPbGhhbmRvIHBhcmEgb3Mgw6FsYnVucyBvcmlnaW5haXMgKHJlbWFzdGVyID0gRkFMU0UpIMOpIHBvc3PDrXZlbCBwZXJjZWJlciB1bSBncmFuZGUgYXVtZW50byBubyB0ZW1wbyBkZSBkdXJhw6fDo28gZGFzIG3DunNpY2FzIG5vIMOhbGJ1bSBlbSAxOTY3IHNlZ3VpZG8gZGUgdW1hIGRpbWludWnDp8OjbyBubyDDoWxidW0gc2VndWludGUgMTk2OC4gRXNzZSBjaG9xdWUgbm8gcGVyZmlsIGRvcyBkb2lzIMOhbGJ1bnMgcmVxdWVyIHVtYSBleHBsaWNhw6fDo28gcXVlIG7Do28gZXN0w6Egbm9zIGRhZG9zLgoKTyDDoWxidW0gZGUgMTk2NyAqKkEgQnJhemEgZG8gTm9ydGUqKiwgcHJpbWVpcm8gZ3JhdmFkbyBuYSBncmF2YWRvcmEgQ2FudGFnYWxvIG1hcmNhIHRhbWLDqW0gdW0gbW9tZW50byBlc3BlY2lhbCBuYSB2aWRhIGRvIGNhbnRvciwgcG9pcyBlc3NlIMOpIG8gYW5vIGRlIHNldSBkaXbDs3JjaW8gZGUgQWxtaXJhLCBwYXJjZWlyYSBuYSBtw7pzaWNhIGUgZXNwb3NhLiBEZSBtw7pzaWNhcyBtYWlzIGxvbmdhcyBlIGRlIGZhaXhhcyBkZSBsZXRyYSBtYWlzIHRyaXN0ZSBjb21vICoqIlBhc3NhcmluaG8gYWJhbmRvbmFkbyIqKiBjb21wb3N0YSBwZWxvIHByw7NwcmlvIEphY2tzb24sIGVzc2UgcGVyZmlsIGluY29tdW0gZG8gw6FsYnVtIGFjYWJhIHBvciByZWZsZXRpciBlc3NlIG1vbWVudG8gZGEgdmlkYSBkbyBjYW50b3IuCgpPIMOhbGJ1bSBkZSAxOTY4IHBvciBvdXRybyBsYWRvIMOpIHVtYSBjb2xldMOibmVhIGUgcmXDum5lIGFsZ3VtYXMgZGFzIG3DunNpY2FzIGF0w6kgZW50w6NvIG1haXMgcG9wdWxhcmVzIChlIHRhbWJwZW0gY3VydGFzIGRvIGNhbnRvcikuIEVzc2EgY29sZXTDom5lYSBjYXNhIGNvbSB1bSBpbmF1ZGl0byBwb3LDqW0gY3VydG8gaGlhdG8gZG8gY2FudG9yIHF1ZSBwZWxhIHByaW1laXJhIHZleiBwYXNzYSB1bSBhbm8gc2VtIHB1YmxpY2FyIHVtIMOhbGJ1bSwgbyBxdWFsIHBvZGUgc2VyIGF0cmlidcOtZG8gYW8gc2V1IGRpdsOzcmNpby4KCiogT3Mgw6FsYnVucyByZW1hc3Rlcml6YWRvcy9yZWxhbsOnYWRvcyByZcO6bmVtIGZhaXhhcyBhbGd1bWFzIHZlemVzIGRlIGRpZmVyZW50ZXMgbW9tZW50b3MgZGEgY2FycmVpcmEgZG8gY2FudG9yLCBlIHBvciBpc3NvIGZpY2EgZGlmw61jaWwgYXRyaWJ1aXIgdW0gc2lnbmlmaWNhZG8gcGVydGluZW50ZSDDoCBkdXJhw6fDo28gZGUgc3VhcyBmYWl4YXMuIAoKCiMjIE9zIGFsYnVucyByZWxhbsOnYWRvcy9yZW1hc3Rlcml6YWRvcyBzw6NvIG1haXMgcG9wdWxhcmVzPyAKCmBgYHtyfQojIGxvbGxpcG9wIGNoYXJ0Cm0gPC0gbGlzdCgKICBsID0gMzcwKQoKcCA8LSBkYXRhICU+JQogICAgICAgIGdncGxvdChhZXMoYWxidW1fcG9wdWxhcml0eSx5PXJlb3JkZXIoYWxidW1fbmFtZSxhbGJ1bV9wb3B1bGFyaXR5KSwKICAgICAgICAgICAgICAgICAgIGNvbG9yPXJlbWFzdGVyLAogICAgICAgICAgICAgICAgICAgZ3JvdXA9cmVtYXN0ZXIpKSArCiAgICAgICAgICAgIGdlb21fc2VnbWVudChhZXMoeCA9IDAsIHkgPSByZW9yZGVyKGFsYnVtX25hbWUsYWxidW1fcG9wdWxhcml0eSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhlbmQgPSBhbGJ1bV9wb3B1bGFyaXR5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZW5kID0gYWxidW1fbmFtZSkpICsgCiAgICAgICAgZ2VvbV9wb2ludCgpICsKICAgICAgICB0aGVtZShheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpKQoKZ2dwbG90bHkocCx0b29sdGlwPU5BKSAlPiUKICBsYXlvdXQoYXV0b3NpemUgPSBGLAogICAgICAgICBtYXJnaW4gPSBtKQpgYGAKCkZpY2EgZXZpZGVudGUgcXVlIHBhcmEgSmFja3NvbiBkbyBQYW5kZWlybyAqKm9zIMOhbGJ1bnMgcmVtYXN0ZXJpemFkb3MvcmVsYW7Dp2Fkb3MgZG9taW5hbSBvIGNlbsOhcmlvIGRvIFNwb3RpZnkgZW0gdGVybW9zIGRlIHBvcHVsYXJpZGFkZSoqLiAKUHJpbWVpcmFtZW50ZSwgc2ltcGxlc21lbnRlIG9ic2VydmFuZG8gYSBwcm9wb3LDp8OjbyBlbnRyZSByZW1hc3Rlcml6YWRvcyBlIG7Do28gcmVtYXN0ZXJpemFkb3MgZmljYSBldmlkZW50ZSBxdWUgb3MgcHJpbWVpcm9zIHPDo28gb3MgcXVlIG8gU3BvdGlmeSBtYWlzIGRpc3BvbmliaWxpemEuIFNlZ3VuZG8sIGxldmFuZG8gZW0gY29uc2lkZXJhw6fDo28gYSBxdWVzdMOjbyBkZSBxdWFsaWRhZGUgZGUgw6F1ZGlvIGVyYSBkZSBzZSBlc3BlcmFyIHF1ZSBvcyByZW1hc3Rlcml6YWRvcyB0b21hc3NlbSBhIGRpYW50ZWlyYS4KCiMjIENvbW8gbyB0ZW1wbyBhZmV0YSBhIGRpc3RyaWJ1acOnw6NvIGRhcyBub3RhcyBtdXNpY2FpcyA/CgpgYGB7cn0KdGltMTJlcXVhbCA9IGMoIiMwMDAwOEYiLCAiIzAwMDBFQSIsICIjMDA0N0ZGIiwgIiMwMEEyRkYiLCAiIzAwRkVGRiIsICIjNUFGRkE1IiwgIiNCNUZGNEEiLCAiI0ZGRUQwMCIsICIjRkY5MjAwIiwgIiNGRjM3MDAiLCAiI0RCMDAwMCIsICIjODAwMDAwIikKCgptIDwtIGxpc3QoCiAgICBsPTgwLAogICAgcj0zMCk7CgpwIDwtICBkYXRhICU+JQogICAgc2VsZWN0KGtleSxhbGJ1bV9yZWxlYXNlX2RhdGUsIHJlbWFzdGVyKSAlPiUKICAgIGdyb3VwX2J5KGFsYnVtX3JlbGVhc2VfZGF0ZSxrZXkscmVtYXN0ZXIpICU+JQogICAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUKICAgIG11dGF0ZShwcm9wID0gY291bnQvc3VtKGNvdW50KSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoYWxidW1fcmVsZWFzZV9kYXRlKSwgCiAgICAgICAgICAgICAgIHkgPSBjb3VudCwgZmlsbCA9IGtleSwKICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlKAogICAgICAgICAgICAgICAgICAgICJQcm9wb3LDp8OjbzoiLCBjb3VudCAqIDEwLCIlIgogICAgICAgICAgICAgICAgICAgICApKSkgKwogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiLCB3aWR0aCA9IC43KSAgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gdGltMTJlcXVhbCkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxKSkgICsKICAgIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpKSArCiAgICBmYWNldF9ncmlkKHJlbWFzdGVyIH4gLikgKwogICAgZ2d0aXRsZSgiTm90YXMgbXVzaWNhaXMgKGRpc3RpbsOnw6NvIHBvciByZW1hc3Rlcml6YcOnw6NvKSIpICsKICAgIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZCh0aXRsZT0iIikpCgpnZ3Bsb3RseShwLCB0b29sdGlwPSJ0ZXh0IikgJT4lCiAgICAgIGxheW91dChhdXRvc2l6ZSA9IEYsCiAgICAgICAgICAgICBtYXJnaW4gPSBtLAogICAgICAgICAgICAgbGVnZW5kID0gbGlzdCgKICAgICAgb3JpZW50YXRpb24gPSAiaCIsIHkgPS0wLjIKICAgICkpCgpgYGAKCiogw4kgcG9zc8OtdmVsIHZlciBxdWUgbm8gY29tZcOnbyBkb3MgYW5vcyAxOTYwIMOtbmljaW8gYXMgbcO6c2ljYXMgbmEgZXNjYWxhIGVudHJlIEUgZSBHIGRvbWluYW0gZm9ydGVtZW50ZSBvIHJlcGVydMOzcmlvIGRlIEphY2tzb24sIGN1cmlvc2FtZW50ZSBxdWFuZG8gYXMgbcO6c2ljYXMgZGUgbm90YXMgZW50cmUgQSBlIEMgY2hlZ2FtIGEgb2N1cGFyIG1ldGFkZSBkYXMgb2NvcnLDqm5jaWFzLiAgIAogICAgKyBJc3NvIGVzdMOhIGRlIGFjb3JkbyBjb20gbyBwZXJmaWwgZGUgSmFja3Nvbiwgbm90w7NyaW8gcG9yIHN1YSBoZXRlcm9nZW5laWRhZGUsIGFsw6ltIGRpc3NvIG8gw6FsYnVtIGRlIDE5NjcgY29tbyBmb2kgZGl0byBhbnRlcmlvcm1lbnRlIHJlcHJlc2VudGEgdW1hIG11ZGFuw6dhIG5vIHRvbSBkbyBjYW50b3IgdGFtYsOpbSBwb3IgbW90aXZvcyBwZXNzb2FpcyAoc2V1IGRpdsOzcmNpbykuICAKICogT3Mgw6FsYnVucyByZW1hc3Rlcml6YWRvcyByZWZsZXRlbSB1bWEgZ3JhbmRlIHZhcmlhw6fDo28gZW0gdGVybW9zIGRlIG5vdGFzIG11c2ljYWlzIGrDoSBlc3BlcmFkYSBkYWRvIHF1ZSBlc3NlIGNvbmp1dG8gcmXDum5lIHVtYSBxdWFzZSBjYcOzdGljYSBzw6lyaWUgZGUgY29sZXTDom5lYXMsIHNlbGXDp8O1ZXMgZGl2ZXJzYXMgZSByZWxhbsOnYW1lbnRvcyBxdWUgYWNhYmFtIG1pc3R1cmFuZG8gbW9tZW50b3MgZGlmZXJlbnRlcyBkYSBjYXJyZWlyYSBkbyBjYW50b3IuICAKICAgICsgTyBmYXRvIGRlIEphY2tzb24gc2UgZW50cmVnYXIgYSBkaXZlcnNvcyBlc3RpbG9zIG11c2ljYWlzIMWbbyBtdWx0aXBsaWNhIGVzc2EgdmFyaWHDp8OjbyBlbSB0ZXJtb3MgZGUgbm90YXMgbXVzaWNhaXMgKEphY2tzb24gc2UgZW52b2x2ZXUgY29tIGJhacOjbywgeG90ZSwgeGF4YWRvLCBjb2NvLCBhcnJhc3RhcMOpLCBxdWFkcmlsaGEsIG1hcmNoYSwgZnJldm8sICoqZSBvdXRyb3MqKiksIGlzc28gZmljYSBldmlkZW50ZSBuYSB2YXJpYcOnw6NvIGrDoSBub3Mgw6FsYnVucyBuw6NvIHJlbWFzdGVyaXphZG9zLgo=